/* 包含头文件-----------------------------------------------------------------*/
#include "tim.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/


/* 在别的地方复现此函数  TIM1中断函数
void TIM1_UP_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) 
    {    
        TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
    }
}
*/
/* 在别的地方复现此函数  TIM2中断函数
void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 
    {    
        TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
    }    
}
*/
/* 在别的地方复现此函数  TIM3中断函数
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) 
    {    
        TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update);
    }
}
*/

/**
  * @brief  TIM1初始化
  * @param  None
  * @retval None
  */
void tim1_init_config(uint16_t arr, uint16_t psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
    NVIC_InitTypeDef NVIC_InitStructure; 
    // 设置中断组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        
    // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;    
    // 设置主优先级
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;     
    // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);    
    // 自动重装载寄存器的值，累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period = arr;
    // 时钟预分频数
    TIM_TimeBaseStructure.TIM_Prescaler = psc;    
    // 时钟分频因子 ，没用到不用管
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
    // 计数器计数模式，设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         
    // 重复计数器的值，没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;    
    // 初始化定时器
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    // 清除计数器中断标志位
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);
    // 开启计数器中断
    TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
    // 使能计数器
    TIM_Cmd(TIM1, ENABLE);
}

/**
  * @brief  TIM2初始化
  * @param  None
  * @retval None
  */
void tim2_init_config(uint16_t arr, uint16_t psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
    NVIC_InitTypeDef NVIC_InitStructure; 
    // 设置中断组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        
    // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;    
    // 设置主优先级
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;     
    // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    
    // 自动重装载寄存器的值，累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period = arr;
    // 时钟预分频数
    TIM_TimeBaseStructure.TIM_Prescaler= psc;    
    // 时钟分频因子 ，没用到不用管
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
    // 计数器计数模式，设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         
    // 重复计数器的值，没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;    
    // 初始化定时器
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    // 清除计数器中断标志位
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    // 开启计数器中断
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    // 使能计数器
    TIM_Cmd(TIM2, ENABLE);
}

/**
  * @brief  TIM3初始化
  * @param  None
  * @retval None
  */
void tim3_init_config(uint16_t arr, uint16_t psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
    NVIC_InitTypeDef NVIC_InitStructure; 
    // 设置中断组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        
    // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;    
    // 设置主优先级
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;     
    // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    
    // 自动重装载寄存器的值，累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period = arr;
    // 时钟预分频数
    TIM_TimeBaseStructure.TIM_Prescaler = psc;    
    // 时钟分频因子 ，没用到不用管
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
    // 计数器计数模式，设置为向上计数
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;         
    // 重复计数器的值，没用到不用管
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;    
    // 初始化定时器
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    // 清除计数器中断标志位
    TIM_ClearFlag(TIM3, TIM_FLAG_Update);
    // 开启计数器中断
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
    // 使能计数器
    TIM_Cmd(TIM3, ENABLE);
}
